import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, getUserInfo } from '@/api/user'
import{constantRoutes} from '@/router'
import{resetRouter} from '@/router'
const state = {
  token: getToken(), // 从缓存中读取初始值
  userInfo: {}, // 存储用户基本资料状态
  routes:constantRoutes
  //静态路由的数组
}
//Mutation 是 Vuex 中用于同步更改状态的函数。它们必须是同步的，因为 Vuex 需要确保状态的变更是可追踪的。
const mutations = {
  setToken(state, token) {
    state.token = token
    // 同步到缓存
    setToken(token)


  },
  removeToken(state) {
    // 删除Vuex的token
    state.token = null
    removeToken()
  },
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },setRoutes(state,newRoutes){
    state.routes=[...constantRoutes,...newRoutes]
    //静态路由＋动态路由
  
  }

}
//Action 是 Vuex 中用于处理异步操作的函数。它们可以包含任意异步代码，比如 API接口 请求。
//用法: Action 通过 dispatch 来调用，可以返回一个 Promise，通常用于处理异步逻辑，然后再通过 commit 来调用 mutation。
const actions = {
  // context上下文，传入参数  data 参数是用户登录时提交的信息，通常包括用户名和密码。
  async login(context, data) {
    // todo: 调用登录接口
    const result = await login(data)  //调用一个 login 函数（很可能是之前提到的 API 请求函数），并将 data 作为参数传入。
    //使用 await 关键字等待该函数的执行结果，这个结果通常是服务器返回的 token 或登录状态。
    // 返回一个token 123456
    context.commit('setToken', result) // 提交 mutation 更新 token
    
  },
  // 获取用户的基本资料   //context 是 Vuex 提供的上下文对象，包含了 state、getters、commit、dispatch 等属性和方法。
  async getUserInfo(context) {
    const result = await getUserInfo()
    context.commit('setUserInfo', result)   //mutation中对应（state，data）
    return result//返回数据到permission  
      
    
    
  },
  // 退出登录的action
  logout(context){
    context.commit('removeToken')//移除token
    context.commit('setuserInfo',{})    //更新用户信息为空
    // 重置路由
    resetRouter()
  }
  // logout(context) {
  //   context.commit('removeToken') // 删除token
  //   context.commit('setUserInfo', {}) // 设置用户信息为空对象
  // }
}

export default {
  namespaced: true, // 开启命名空间
  state,
  mutations,
  actions
}

//Vuex 允许将 store 分割成模块，每个模块可以拥有自己的 state、mutations、actions 和 getters。
//当使用 namespaced: true 时，模块会被赋予一个命名空间，使得它的状态管理更为独立。

//如果没有命名空间，不同模块中的同名 mutation 或 action 在全局范围内会产生冲突